Spring Boot JPA এবং Caching

Java Technologies - স্প্রিং বুট জেপিএ (Spring Boot JPA)
278

Caching হল একটি গুরুত্বপূর্ণ কৌশল যা ডেটাবেস অপারেশনগুলির পারফরম্যান্স উন্নত করার জন্য ব্যবহৃত হয়। Spring Boot JPA ব্যবহার করে ডেটাবেস থেকে ডেটা রিট্রিভ করার সময় আপনি caching প্রযুক্তি ব্যবহার করে সিস্টেমের কার্যকারিতা এবং প্রতিক্রিয়া সময় (response time) কমিয়ে আনতে পারেন। Spring Boot এবং Spring Data JPA এ caching ব্যবহারের মাধ্যমে ডেটা রিড অপারেশন দ্রুত করা যায়, যা বিশেষ করে রিড-হেভি অ্যাপ্লিকেশনগুলোর জন্য উপকারী।

Spring Boot JPA এবং Caching ব্যবহারের মাধ্যমে আপনি ডেটা অ্যাক্সেসে আরো দ্রুততার সাথে কাজ করতে পারবেন, কারণ একবার ডেটা ক্যাশে চলে গেলে, পরবর্তী রিকুয়েস্টগুলির জন্য ডেটা সরাসরি ক্যাশ থেকে রিটার্ন করা হবে, ডাটাবেসে আবার যাচাই করা হবে না।


Spring Boot JPA এবং Caching এর মধ্যে সম্পর্ক

Spring Boot JPA তে Caching ব্যবহারের জন্য আপনি Spring Cache Abstraction ব্যবহার করতে পারেন, যা ক্যাশ মেকানিজম সরবরাহ করে। Spring Caching ব্যবহারের মাধ্যমে আপনি Spring Bean-এ ক্যাশিং অ্যাপ্লিকেশন লজিক বাস্তবায়ন করতে পারবেন এবং বিভিন্ন ক্যাশ মেকানিজম (যেমন Ehcache, Redis, Caffeine ইত্যাদি) ব্যবহার করতে পারবেন।

Spring Boot Caching Process:

  1. Entity Caching: JPA Entity এর ডেটা ক্যাশ করা হয়।
  2. Repository Method Caching: @Cacheable অ্যানোটেশন ব্যবহার করে Spring Data JPA রেপোজিটরি মেথডগুলোর রিটার্ন ভ্যালু ক্যাশ করা হয়।

Caching এর জন্য Spring Boot Configuration

Spring Boot অ্যাপ্লিকেশনটির ক্যাশিং কনফিগারেশনের জন্য কিছু সেটিংস কনফিগার করা প্রয়োজন। আপনি application.properties অথবা application.yml ফাইলের মাধ্যমে ক্যাশিং কনফিগারেশন সেট করতে পারেন। এখানে Ehcache এবং Redis ক্যাশিং ব্যবহারের উদাহরণ দেখানো হচ্ছে।

১. Ehcache Caching Configuration

Ehcache একটি জনপ্রিয় ইন-মেমরি ক্যাশিং লাইব্রেরি যা Spring Caching Abstraction-এর সাথে সহজে ইন্টিগ্রেট করা যায়।

উদাহরণ: Ehcache Configuration in application.properties

# Enable Caching
spring.cache.type=ehcache

# Ehcache Configuration
spring.cache.ehcache.config=classpath:ehcache.xml

এখানে ehcache.xml ফাইলটি ক্যাশিং কনফিগারেশন ধারণ করে, যা Ehcache কনফিগারেশন সেট করে।

উদাহরণ: ehcache.xml Configuration

<ehcache xmlns="http://www.ehcache.org/v3">
    <cache alias="employeeCache">
        <key-type>java.lang.Long</key-type>
        <value-type>com.example.Employee</value-type>
        <heap>1000</heap>
        <expiry>
            <ttl unit="seconds">3600</ttl> <!-- Time-to-live for cached entries -->
        </expiry>
    </cache>
</ehcache>

এখানে, employeeCache নামে একটি ক্যাশ তৈরি করা হয়েছে এবং এর মধ্যে Employee Entity এর তথ্য ক্যাশে রাখা হবে।


২. Redis Caching Configuration

Redis একটি ডিস্ক-বেসড ইন-মেমরি ডাটাবেস যা ক্যাশিং সলিউশন হিসেবে ব্যবহৃত হয়। Redis ব্যবহার করার জন্য Spring Boot Redis Starter প্যাকেজটি প্রয়োজন।

Dependencies in pom.xml (for Redis)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

Redis Configuration in application.properties

# Enable Caching
spring.cache.type=redis

# Redis Configuration
spring.redis.host=localhost
spring.redis.port=6379

এখানে, Redis সার্ভারের হোস্ট এবং পোর্ট নম্বর নির্ধারণ করা হয়েছে। Spring Boot স্বয়ংক্রিয়ভাবে Redis কানেকশন সেটআপ করবে এবং Redis ক্যাশিং ব্যবহারের জন্য প্রস্তুত হবে।


Spring Data JPA এবং Caching

Spring Data JPA তে ক্যাশিং করার জন্য @Cacheable অ্যানোটেশন ব্যবহার করা হয়। এটি Spring Data JPA রেপোজিটরি মেথডের রিটার্ন ভ্যালুকে ক্যাশে রাখে, এবং পরবর্তী রিকুয়েস্টগুলির জন্য ক্যাশে থেকে ডেটা সরবরাহ করে।

উদাহরণ: @Cacheable ব্যবহার করে Caching

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Repository;

@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {

    @Cacheable("employees")
    List<Employee> findByDepartment(String department);
}

এখানে, findByDepartment() মেথডের জন্য @Cacheable অ্যানোটেশন ব্যবহৃত হয়েছে। প্রথমবার যখন এই মেথডটি কল হবে, তখন ডেটা ডাটাবেস থেকে ফেচ করা হবে এবং ক্যাশে রাখা হবে। পরবর্তী রিকুয়েস্টে, ক্যাশ থেকে ডেটা সরবরাহ করা হবে এবং ডাটাবেস থেকে আবার রিড করা হবে না।

Caching with Custom Queries

@Cacheable(value = "employees", key = "#department")
public List<Employee> findByDepartment(String department) {
    return employeeRepository.findByDepartment(department);
}

এখানে @Cacheable অ্যানোটেশনটি department প্যারামিটারকে key হিসেবে ব্যবহার করছে। এতে, একই ডিপার্টমেন্টের জন্য একাধিক রিকুয়েস্টে ক্যাশ থেকে ডেটা সরবরাহ করা হবে।


Spring Boot JPA Caching Performance

Caching ডেটাবেসের সাথে অপারেশনগুলিকে আরও দ্রুত করে তোলে, বিশেষ করে যখন একই ডেটা বারবার রিড করা হয়। Caching ব্যবহারের মাধ্যমে:

  • ফাস্ট রিড অপারেশন: একবার ডেটা ক্যাশে সংরক্ষণ হলে পরবর্তী রিকুয়েস্টে দ্রুত রেসপন্স পাওয়া যায়।
  • ডাটাবেস লোড কমানো: ক্যাশে থেকে ডেটা রিটার্ন করার মাধ্যমে ডাটাবেসের ওপর চাপ কমে যায়।
  • অপারেশন পারফরম্যান্স বৃদ্ধি: ক্যাশিং পারফরম্যান্স বৃদ্ধি করে, বিশেষত রিড-হেভি অ্যাপ্লিকেশনগুলিতে।

তবে, ক্যাশিং ব্যবহারের সময়, আপনাকে cache eviction এবং TTL (Time-to-Live) কনফিগারেশন সম্বন্ধে সঠিকভাবে মনোযোগ দিতে হবে, যাতে ক্যাশে থাকা অপ্রয়োজনীয় ডেটা ডাটাবেসের সাথে সিঙ্ক্রোনাইজ হয়।


সারাংশ

Spring Boot JPA এবং Caching একটি শক্তিশালী সংমিশ্রণ, যা অ্যাপ্লিকেশনগুলির পারফরম্যান্স উন্নত করতে ব্যবহৃত হয়। Ehcache, Redis এবং Spring Cache Abstraction ব্যবহার করে, আপনি read-heavy অ্যাপ্লিকেশনগুলিতে ক্যাশিং কার্যক্রম বাস্তবায়ন করতে পারেন। Spring Data JPA-এর সাথে @Cacheable অ্যানোটেশন ব্যবহারের মাধ্যমে আপনি ক্যাশে ডেটা সংরক্ষণ এবং পুনরায় ব্যবহার করতে পারেন, যা ডেটাবেসের লোড কমিয়ে দেয় এবং পারফরম্যান্স বৃদ্ধি করে।

Content added By

Caching এর ধারণা এবং Spring Boot JPA তে এর প্রয়োজনীয়তা

283

Caching একটি জনপ্রিয় কৌশল যা সিস্টেমের পারফরম্যান্স উন্নত করতে ব্যবহৃত হয়। Caching এর মাধ্যমে, সাধারণত ব্যবহৃত বা অতীতে ব্যবহৃত ডেটা কিছু সময়ের জন্য মেমোরিতে সংরক্ষিত থাকে, যাতে পরবর্তী সময়ে সেই ডেটা পুনরায় রিকোয়েস্ট করা হলে তা ডেটাবেস বা অন্যান্য ডেটা সোর্স থেকে পুনরায় না আনা হয়। এটি অ্যাপ্লিকেশন এবং ডেটাবেসের মধ্যে লোড কমাতে সাহায্য করে এবং দ্রুত ডেটা অ্যাক্সেস নিশ্চিত করে।

স্প্রিং বুট জেপিএ (Spring Boot JPA) ব্যবহারের ক্ষেত্রে Caching এর ভূমিকা অত্যন্ত গুরুত্বপূর্ণ, কারণ এটি ডেটাবেস অ্যাক্সেসের সংখ্যা কমিয়ে সিস্টেমের পারফরম্যান্স এবং স্কেলেবিলিটি উন্নত করে।


Caching এর ধারণা

Caching হল একটি পদ্ধতি যার মাধ্যমে আপনি সাধারণত ব্যবহৃত ডেটা বা ইনফরমেশনকে কিছু সময়ের জন্য মেমোরিতে সংরক্ষণ করেন, যাতে পরবর্তী সময়ে যখন সেটি প্রয়োজন হবে, তখন তা দ্রুত পাওয়া যায়। Caching এর মাধ্যমে:

  1. Performance Improvement: মেমোরিতে ডেটা সংরক্ষণ করা হলে ডেটাবেস থেকে বারবার ডেটা রিট্রিভ করার প্রয়োজন হয় না, ফলে সিস্টেমের পারফরম্যান্স বৃদ্ধি পায়।
  2. Reduced Database Load: সিস্টেমের লোড কমে, কারণ ডেটাবেস থেকে প্রতি রিকোয়েস্টে ডেটা আনা হয় না।
  3. Latency Reduction: মেমোরি থেকে ডেটা দ্রুত অ্যাক্সেস করা যায়, যা ডেটাবেস থেকে ডেটা আনার তুলনায় অনেক দ্রুত হয়।

এটি সাধারণত রিড-অরিয়েন্টেড অ্যাপ্লিকেশনে ব্যবহৃত হয়, যেখানে একই ডেটা একাধিকবার রিকোয়েস্ট করা হয়।


Spring Boot JPA তে Caching এর প্রয়োজনীয়তা

স্প্রিং বুট জেপিএ (Spring Boot JPA) ব্যবহারের ক্ষেত্রে caching গুরুত্বপূর্ণ কারণ:

  1. ডেটাবেস অ্যাক্সেস কমানো: জিপিএ (JPA) কুইরি বা ডেটা ফেচিং অপারেশনের জন্য প্রতিবার ডেটাবেসে রিকোয়েস্ট পাঠানোর পরিবর্তে ক্যাশ থেকে ডেটা পুনরুদ্ধার করা হয়, যা ডেটাবেস অ্যাক্সেসের সংখ্যা কমায়।
  2. ডেটাবেস পারফরম্যান্স বৃদ্ধি: ডেটাবেসে অত্যধিক রিকোয়েস্ট পাঠানো একে ধীর করে ফেলতে পারে। Caching ব্যবহার করলে, পুনরায় একই ডেটা রিকোয়েস্ট করার জন্য ডেটাবেসে যেতে হয় না, যা ডেটাবেস পারফরম্যান্স উন্নত করে।
  3. অ্যাপ্লিকেশনের প্রতিক্রিয়া ক্ষমতা উন্নত করা: ক্যাশিং ব্যবহার করলে, ডেটার রিডিং অপারেশন অনেক দ্রুত হয়, ফলে অ্যাপ্লিকেশন আরো দ্রুত প্রতিক্রিয়া দিতে পারে।

Spring Boot JPA তে Caching সাধারণত নিম্নলিখিত কারণে গুরুত্বপূর্ণ:

  • Frequently Accessed Data: ডেটা যদি বেশিরভাগ সময় পরিবর্তন না হয় এবং অনেকবার এক্সেস করা হয়, তবে ক্যাশিং খুব কার্যকর হতে পারে।
  • Complex Queries: জটিল বা দীর্ঘ সময় নেয় এমন কুইরির জন্য ক্যাশিং অত্যন্ত উপকারী।
  • Scalability: যখন অ্যাপ্লিকেশন বড় হয়ে ওঠে এবং প্রচুর ডেটাবেস রিকোয়েস্ট হয়, তখন ক্যাশিং সিস্টেমকে স্কেল করতে সাহায্য করে।

Spring Boot JPA তে Caching কিভাবে কাজ করে?

Spring Boot JPA তে Caching ব্যবহারের জন্য আপনাকে Spring Cache সমর্থিত সিস্টেম বা JPA 2nd-level cache কনফিগার করতে হবে। Second-Level Cache হল একটি ক্যাশিং কৌশল যা JPA (Java Persistence API) কনটেক্সটের বাইরে ব্যবহৃত হয় এবং এটি Hibernate এর মাধ্যমে নিয়ন্ত্রণ করা হয়।

1. First-Level Cache (Persistence Context Cache)

  • First-Level Cache হল EntityManager এর ক্যাশ, যা JPA কনটেক্সটে অ্যাক্সেস করা ডেটা সংরক্ষণ করে। এটি ডিফল্টভাবে স্প্রিং বুটে সক্রিয় থাকে এবং এই ক্যাশটি ব্যবহারকারীর ট্রানজেকশনের মধ্যে ডেটা সংরক্ষণ করে।
  • এই ক্যাশটি Session এর সাথে সম্পর্কিত, অর্থাৎ, ট্রানজেকশনের মধ্যে সংরক্ষিত ডেটা পুনরায় ব্যাবহারযোগ্য থাকে।

2. Second-Level Cache (Hibernate Cache)

Second-Level Cache হল হাইবারনেট ক্যাশিং সিস্টেম যা ডেটাবেসের বাইরে ডেটা ক্যাশিং করে, এবং এটি EntityManager বা SessionFactory এর বাইরে পরিচালিত হয়। এই ক্যাশিং ব্যবস্থার মাধ্যমে, হাইবারনেট জিপিএ এন্টিটিকে ক্যাশে রাখে, যাতে বারবার একই ডেটা রিকোয়েস্টে ডেটাবেসে যেতে না হয়।


Spring Boot JPA তে Caching কনফিগারেশন

1. Spring Boot Cache কনফিগারেশন

স্প্রিং বুটে ক্যাশিং সক্রিয় করতে, আপনাকে @EnableCaching অ্যানোটেশন ব্যবহার করতে হবে এবং ক্যাশ ম্যানেজারের কনফিগারেশন করতে হবে।

Step 1: Caching কনফিগারেশন সক্রিয় করা

@EnableCaching অ্যানোটেশন স্প্রিং কনফিগারেশন ক্লাসে যোগ করতে হবে।

import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableCaching
public class CacheConfig {
    // Cache manager configuration here
}

Step 2: CacheManager কনফিগার করা

স্প্রিং ক্যাশ ব্যবস্থাপনা করার জন্য, সাধারণত CacheManager কনফিগার করতে হয়। আপনি SimpleCacheManager অথবা EhCache ব্যবহার করতে পারেন।

import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.concurrent.ConcurrentMapCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableCaching
public class CacheConfig {

    @Bean
    public CacheManager cacheManager() {
        return new ConcurrentMapCacheManager("employees");
    }
}

এখানে, ConcurrentMapCacheManager একটি সিম্পল ক্যাশ ম্যানেজার যা মেমোরিতে ক্যাশ পরিচালনা করে।

2. Second-Level Cache Enable করা

Hibernate Second-Level Cache সক্রিয় করতে আপনাকে hibernate.cache.use_second_level_cache প্রপার্টি সেট করতে হবে এবং ক্যাশ প্রোভাইডার (যেমন EhCache বা Caffeine) কনফিগার করতে হবে।

Step 1: Hibernate ক্যাশ কনফিগারেশন

application.properties ফাইলে Hibernate ক্যাশ সক্রিয় করুন:

spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory

Step 2: EhCache কনফিগারেশন

ehcache.xml ফাইলে ক্যাশ কনফিগারেশন যুক্ত করুন:

<ehcache xmlns="http://www.ehcache.org/schema/ehcache"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.ehcache.org/schema/ehcache
             http://www.ehcache.org/schema/ehcache/ehcache-2.10.xsd">
    <cache name="employees" maxEntriesLocalHeap="1000" eternal="true" />
</ehcache>

এখানে, employees নামে ক্যাশ সেটআপ করা হয়েছে।


সারাংশ

Caching স্প্রিং বুট জেপিএ (Spring Boot JPA)-তে পারফরম্যান্স অপটিমাইজেশনের জন্য একটি গুরুত্বপূর্ণ কৌশল। এটি ডেটাবেস অ্যাক্সেসের সংখ্যা কমিয়ে সিস্টেমের প্রতিক্রিয়া ক্ষমতা এবং স্কেলেবিলিটি বৃদ্ধি করে। First-Level Cache এবং Second-Level Cache ব্যবহারের মাধ্যমে ডেটাবেস অপারেশনগুলোর পারফরম্যান্স উন্নত করা সম্ভব।

স্প্রিং বুটে Spring Cache কনফিগারেশন এবং Hibernate Second-Level Cache ব্যবহার করে আপনি ক্যাশিং সক্রিয় করতে পারেন, যা ডেটাবেসের উপর চাপ কমিয়ে অ্যাপ্লিকেশনকে দ্রুততর এবং আরও কার্যকরী করে তোলে।

Content added By

First Level এবং Second Level Caching এর ব্যবহার

344

Caching হল এক গুরুত্বপূর্ণ কৌশল যা ডাটাবেস অ্যাক্সেসের পারফরম্যান্স উন্নত করতে ব্যবহৃত হয়। Spring Boot JPA তে First Level Cache এবং Second Level Cache দুটি ভিন্ন ধরনের ক্যাশিং ব্যবস্থা রয়েছে। এই দুটি ক্যাশিং ব্যবস্থার মধ্যে পার্থক্য রয়েছে, এবং প্রতিটি ব্যবস্থার নিজস্ব সুবিধা ও ব্যবহার রয়েছে।

১. First Level Cache

First Level Cache হল Hibernate (JPA) এর ডিফল্ট ক্যাশ, যা Session বা EntityManager এর সাথে সম্পর্কিত থাকে। যখন কোনো ডাটাবেস রেকর্ড প্রথমবারের মতো লোড করা হয়, তখন তা Hibernate এর First Level Cache তে সঞ্চিত থাকে। এর পরবর্তী যে কোনো রিকোয়েস্টে একই Entity-এর জন্য ডাটাবেস থেকে পুনরায় ডেটা লোড করার প্রয়োজন হয় না; Hibernate প্রথমবারের মতো লোড হওয়া Entity টিকে ক্যাশ থেকে রিটার্ন করে।

First Level Cache এর বৈশিষ্ট্য:

  1. Session Scoped: এটি Hibernate সেশন বা EntityManager এর সাথে সম্পর্কিত থাকে।
  2. Automatic: Hibernate প্রথমবারের মতো লোড হওয়া Entity ক্যাশ করে এবং স্বয়ংক্রিয়ভাবে ক্যাশ থেকে রিটার্ন করে।
  3. Cannot Be Disabled: First Level Cache Hibernate এ স্বয়ংক্রিয়ভাবে সক্রিয় থাকে এবং এটি নিষ্ক্রিয় করা সম্ভব নয়।

First Level Cache উদাহরণ:

@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    
    // Getters and Setters
}

@Repository
public class EmployeeRepository {
    
    @Autowired
    private EntityManager entityManager;

    public Employee getEmployeeById(Long id) {
        // First request will load the employee and store it in the First Level Cache
        Employee employee1 = entityManager.find(Employee.class, id);
        
        // Second request will fetch the employee from First Level Cache (no DB query)
        Employee employee2 = entityManager.find(Employee.class, id);
        
        return employee1;
    }
}

এখানে, entityManager.find() মেথডের মাধ্যমে প্রথমবার Employee Entity লোড হওয়ার পর, এটি First Level Cache তে সঞ্চিত হয়ে থাকে এবং দ্বিতীয়বার একই Entity এর জন্য কোনো নতুন ডাটাবেস কুয়েরি চালানো হয় না।


২. Second Level Cache

Second Level Cache হল Hibernate এর আরও উন্নত ক্যাশিং ব্যবস্থা, যা SessionFactory এর সাথে সম্পর্কিত থাকে। এটি শুধুমাত্র একসাথে একাধিক সেশনকে এক্সেস করতে সক্ষম হয় এবং First Level Cache এর বাইরে ডেটার ক্যাশিং করার জন্য ব্যবহৃত হয়। এর মাধ্যমে বিভিন্ন সেশনের মধ্যে ডেটা শেয়ার করা সম্ভব হয়।

Second Level Cache এর সাথে Hibernate কনফিগার করা যেতে পারে এবং সাধারণত এটি তৃতীয় পক্ষের ক্যাশিং পন্থা যেমন EhCache, Infinispan, Redis ইত্যাদি ব্যবহার করে পরিচালিত হয়।

Second Level Cache এর বৈশিষ্ট্য:

  1. SessionFactory Scoped: এটি Hibernate সেশন ফ্যাক্টরি (SessionFactory) এর সাথে সম্পর্কিত থাকে।
  2. Can Be Configured: Hibernate এর ক্যাশিং কনফিগারেশন ফাইলের মাধ্যমে এটি কাস্টমাইজ করা যায়।
  3. Optional: এটি ডিফল্টভাবে সক্ষম থাকে না এবং Spring Boot বা Hibernate এর মাধ্যমে সেট আপ করতে হয়।
  4. External Cache Provider: এটি তৃতীয় পক্ষের ক্যাশিং পদ্ধতি ব্যবহার করতে পারে যেমন EhCache, Redis ইত্যাদি।

Second Level Cache সেট আপ উদাহরণ:

Spring Boot JPA-তে Second Level Cache কনফিগারেশন:

  1. Dependencies:

pom.xml (Maven) এ EhCache যোগ করুন:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-ehcache</artifactId>
</dependency>
  1. application.properties ফাইলে Hibernate Cache কনফিগারেশন যোগ করুন:
# Enable second level cache
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory
spring.jpa.properties.hibernate.cache.use_query_cache=true
  1. Entity Class: আপনার Entity-তে ক্যাশিং সক্ষম করতে @Cacheable অ্যানোটেশন ব্যবহার করুন:
@Entity
@Cacheable(true)  // Enable second level cache
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)  // Define cache strategy
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    // Getters and Setters
}

এখানে, @Cacheable(true) অ্যানোটেশন ব্যবহার করে Second Level Cache সক্ষম করা হয়েছে এবং CacheConcurrencyStrategy.READ_WRITE ক্যাশের কনকারেন্সি স্ট্র্যাটেজি নির্ধারণ করা হয়েছে।

  1. Configure EhCache:

src/main/resources/ehcache.xml ফাইলে EhCache কনফিগারেশন নির্ধারণ করুন:

<ehcache xmlns="http://www.ehcache.org/ehcache/xml">
    <cache name="com.example.springbootjpa.model.Employee"
           maxEntriesLocalHeap="1000"
           eternal="false"
           timeToIdleSeconds="600"
           timeToLiveSeconds="1200">
    </cache>
</ehcache>

এখানে EhCache কনফিগারেশন করা হয়েছে, যা Employee Entity এর জন্য ক্যাশ ম্যানেজ করবে।

Second Level Cache এর কার্যকারিতা উদাহরণ:

public void getEmployeeById(Long id) {
    // First request will load the employee and store it in the Second Level Cache
    Employee employee1 = employeeRepository.findById(id).orElseThrow();

    // Second request will fetch the employee from Second Level Cache (no DB query)
    Employee employee2 = employeeRepository.findById(id).orElseThrow();
}

Second Level Cache ব্যবহার করে, প্রথমবার Employee Entity লোড হওয়ার পর, এটি Second Level Cache তে সঞ্চিত হবে। দ্বিতীয়বার একই Entity রিকোয়েস্টে ডাটাবেসে পুনরায় কুয়েরি করা হবে না, এটি সরাসরি ক্যাশ থেকে রিটার্ন হবে।


পারফরম্যান্স অপটিমাইজেশন

  • First Level Cache ডিফল্টভাবে Spring Boot JPA তে সক্ষম থাকে এবং এটি সেশন লেভেল ক্যাশিং করে, যেখানে এক সেশনে একাধিক Entity লোড হলে তাদের মধ্যে পুনরায় ডেটাবেস কুয়েরি না করে ক্যাশ থেকে রিটার্ন করা হয়।
  • Second Level Cache ব্যবহার করার মাধ্যমে আপনি একাধিক সেশনের মধ্যে ডেটা শেয়ার করতে পারবেন এবং ডেটাবেস কুয়েরি কমাতে পারবেন। এটি বিশেষত যখন অনেক বড় অ্যাপ্লিকেশন থাকে এবং অনেক রেকর্ডের সাথে কাজ করতে হয়, তখন কার্যকরী হয়।

সারাংশ

  • First Level Cache Hibernate-এর ডিফল্ট ক্যাশিং মেকানিজম, যা সেশন ভিত্তিক কাজ করে এবং এটি ক্যাশিং স্বয়ংক্রিয়ভাবে পরিচালনা করে।
  • Second Level Cache Hibernate-এর আরও উন্নত ক্যাশিং মেকানিজম, যা SessionFactory ভিত্তিক এবং একাধিক সেশনের মধ্যে ক্যাশ শেয়ার করতে পারে।
  • Second Level Cache চালু করতে EhCache, Infinispan, বা Redis ব্যবহার করা যেতে পারে এবং @Cacheable অ্যানোটেশন ব্যবহার করে এটি Entity ক্লাসে সক্রিয় করা যায়।
  • ক্যাশিং ব্যবহারে পারফরম্যান্স উন্নতি করা সম্ভব, বিশেষত ডেটাবেস কুয়েরি কমাতে এবং রেসপন্স টাইম দ্রুত করতে।

Lazy Loading এবং Eager Loading এর সাথে মিলিয়ে First Level এবং Second Level Caching ব্যবহার করলে Spring Boot JPA অ্যাপ্লিকেশন আরও কার্যকরী এবং স্কেলেবল হয়ে ওঠে।

Content added By

EhCache/Hibernate Caching কনফিগারেশন

287

Caching একটি গুরুত্বপূর্ণ পারফরম্যান্স অপটিমাইজেশন কৌশল যা ডাটাবেসের পুনরাবৃত্ত ডেটা রিড অপারেশনের পরিমাণ কমাতে সাহায্য করে। Hibernate Caching এবং EhCache দুইটি জনপ্রিয় ক্যাশিং প্রযুক্তি যা স্প্রিং বুট জেপিএ (Spring Boot JPA) অ্যাপ্লিকেশনগুলোতে ক্যাশিং প্রয়োগ করার জন্য ব্যবহৃত হয়।

EhCache হল একটি শক্তিশালী, ওপেন সোর্স ক্যাশিং লাইব্রেরি যা স্প্রিং এবং হিবারনেটের জন্য কার্যকর ক্যাশিং সমাধান প্রদান করে। Hibernate Caching হল হিবারনেটের অন্তর্নিহিত ক্যাশিং সমাধান, যা দ্বিতীয় স্তরের ক্যাশ (second-level cache) এর মাধ্যমে ডেটার ক্যাশিং সক্ষম করে।

এখানে আমরা দেখব কিভাবে EhCache এবং Hibernate Caching কনফিগারেশন করা যায় স্প্রিং বুট জেপিএ অ্যাপ্লিকেশনে।


Step 1: Maven ডিপেনডেন্সি যোগ করা

Maven ডিপেনডেন্সি:

pom.xml ফাইলে নিচের ডিপেনডেন্সি যোগ করুন:

<dependencies>
    <!-- Spring Boot Starter Data JPA -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <!-- EhCache dependency -->
    <dependency>
        <groupId>org.ehcache</groupId>
        <artifactId>ehcache</artifactId>
        <version>3.9.0</version>
    </dependency>

    <!-- Hibernate Caching dependency -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-ehcache</artifactId>
        <version>5.4.0.Final</version>
    </dependency>

    <!-- Spring Boot Starter Web (for REST API) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Spring Boot Starter Test (for testing) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

এখানে hibernate-ehcache ডিপেনডেন্সি দিয়ে Hibernate-এ EhCache ইন্টিগ্রেশন সাপোর্ট করা হয়েছে। এছাড়া spring-boot-starter-data-jpa ডিপেনডেন্সি দিয়ে JPA এর জন্য প্রয়োজনীয় স্টার্টার যুক্ত করা হয়েছে।


Step 2: application.properties বা application.yml কনফিগারেশন

এখন application.properties ফাইলে Hibernate ও EhCache কনফিগারেশন সেট করা হবে।

application.properties:

# Enable Hibernate second-level cache
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.hibernate.cache.use_query_cache=true
spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory

# Cache settings for EhCache
spring.cache.type=ehcache

এখানে, hibernate.cache.use_second_level_cache=true দ্বারা Hibernate এর দ্বিতীয় স্তরের ক্যাশিং সক্রিয় করা হয়েছে এবং hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory দিয়ে Hibernate কে জানানো হয়েছে যে, ক্যাশিংয়ের জন্য EhCache ব্যবহার করা হবে।


Step 3: EhCache কনফিগারেশন ফাইল তৈরি করা

এখন, EhCache কনফিগারেশন ফাইল তৈরি করতে হবে। এটি একটি XML ফাইল হিসেবে তৈরি করা হয় যেখানে ক্যাশিং কনফিগারেশন থাকবে।

EhCache Config (ehcache.xml):

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns="http://www.ehcache.org/v3">
    <cache alias="productCache">
        <key-type>java.lang.Long</key-type>
        <value-type>com.example.Product</value-type>
        <resources>
            <heap>1000</heap>
            <offheap>10MB</offheap>
        </resources>
    </cache>
</ehcache>

এখানে, productCache একটি ক্যাশ এলিয়াস হিসেবে ব্যবহার করা হয়েছে যা Product Entity এর জন্য কাজ করবে। heap এবং offheap দ্বারা ক্যাশের মেমরি কনফিগারেশন দেওয়া হয়েছে। এটি ক্যাশে কী এবং মানের টাইপও নির্ধারণ করে।


Step 4: Entity ক্লাসে ক্যাশিং প্রয়োগ করা

স্প্রিং বুট জেপিএ এর Entity ক্লাসে ক্যাশিং প্রয়োগ করতে @Cacheable অ্যানোটেশন ব্যবহার করা হয়। @Cacheable অ্যানোটেশন স্প্রিং ক্যাশিং কনফিগারেশন প্রয়োগ করে, এবং এটি ক্যাশে ডেটা রাখার জন্য ব্যবহৃত হয়।

Product Entity Example:

import javax.persistence.Entity;
import javax.persistence.Id;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Product {

    @Id
    private Long id;
    private String name;
    private double price;

    // Constructors, Getters, Setters
}

এখানে, @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) ব্যবহার করে Product Entity এর জন্য Hibernate দ্বিতীয় স্তরের ক্যাশিং সক্রিয় করা হয়েছে। এটি Entity লেভেলে ক্যাশ কনফিগারেশন নির্ধারণ করে।


Step 5: Service Layer এবং Controller তৈরি করা

Service Layer এর মাধ্যমে ক্যাশিং করা যাবে এবং Controller Layer দিয়ে ক্যাশড ডেটা রিটার্ন করা হবে।

Service Layer Example:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class ProductService {

    @Autowired
    private ProductRepository productRepository;

    @Cacheable(value = "productCache", key = "#id")
    public Product getProductById(Long id) {
        System.out.println("Fetching product from database...");
        return productRepository.findById(id).orElse(null);
    }
}

এখানে, @Cacheable অ্যানোটেশন ব্যবহার করে getProductById মেথডের ক্যাশিং নিশ্চিত করা হয়েছে। এটি productCache নামের ক্যাশ ব্যবহার করবে এবং id প্যারামিটারকে কী হিসেবে ব্যবহার করবে।

Controller Layer Example:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/products")
public class ProductController {

    @Autowired
    private ProductService productService;

    @GetMapping("/{id}")
    public Product getProduct(@PathVariable Long id) {
        return productService.getProductById(id);
    }
}

এখানে, ProductController ক্লাসে ProductService এর মাধ্যমে ক্যাশিং করা হয়েছে এবং REST API ব্যবহার করে ক্যাশড ডেটা রিটার্ন করা হচ্ছে।


Step 6: Testing the Cache

এখন, যখন আপনি প্রথমবার getProductById মেথডটি কল করবেন, তখন ডেটা ডাটাবেস থেকে ফেচ হবে। পরবর্তী সময়ে যদি একই id সহ আরেকটি রিকোয়েস্ট আসে, তাহলে ডেটা ক্যাশ থেকে রিটার্ন হবে, এবং ডেটাবেস থেকে আবার ফেচ করা হবে না।


সারাংশ

EhCache এবং Hibernate Caching ব্যবহার করে স্প্রিং বুট অ্যাপ্লিকেশনে ক্যাশিং কনফিগারেশন করার মাধ্যমে আপনি অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করতে পারেন। EhCache একটি শক্তিশালী ক্যাশিং ফিচার যা স্প্রিং বুট এবং হিবারনেটের সাথে ইন্টিগ্রেট করে ডেটা লোডের সময় কমাতে সহায়তা করে। @Cacheable, @Cache এবং Hibernate ক্যাশ কনফিগারেশন ব্যবহার করে ক্যাশিং করতে পারেন, যা পুনরাবৃত্ত ডেটা রিড অপারেশন কমিয়ে অ্যাপ্লিকেশনের কার্যক্ষমতা বৃদ্ধি করে।

Content added By

উদাহরণ সহ Caching কনফিগারেশন

272

Spring Boot JPA এবং Caching

Spring Boot JPA ডেটাবেস অপারেশন এবং ডেটা স্টোরেজ সিস্টেমের সাথে কাজ করার সময় ডেটার caching একটি গুরুত্বপূর্ণ ভূমিকা পালন করে। Caching ব্যবহারের মাধ্যমে, আপনি ডেটাবেসে কম রিকোয়েস্ট পাঠাতে পারেন এবং অ্যাপ্লিকেশন পারফরম্যান্স বৃদ্ধি করতে পারেন। Caching এর মাধ্যমে একবার ফেচ করা ডেটা পরবর্তী রিকোয়েস্টে দ্রুত পাওয়া যায়, যা পারফরম্যান্সের উন্নতি ঘটায়।

Spring Framework ডেটাবেসের জন্য second-level caching সমর্থন করে, যেখানে Spring Data JPA ব্যবহার করে Hibernate এর second-level cache ব্যবহৃত হয়। এর মাধ্যমে JPA ক্যাশিং সরাসরি ডেটাবেসের সাথে সংযুক্ত থাকে না, তবে Hibernate-এর সাথে একত্রে কাজ করে।


1. Spring Boot Caching কনফিগারেশন

Spring Boot অ্যাপ্লিকেশনে caching কনফিগার করার জন্য আপনাকে কিছু গুরুত্বপূর্ণ স্টেপ অনুসরণ করতে হবে:

1.1. Spring Boot Caching এর জন্য Dependency যোগ করা

Spring Boot Caching ব্যবহার করার জন্য প্রথমে আপনার pom.xml ফাইলে Spring Cache এবং JPA এর জন্য নির্ভরশীলতা যোগ করতে হবে।

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-ehcache</artifactId>
    </dependency>
    <dependency>
        <groupId>org.ehcache</groupId>
        <artifactId>ehcache</artifactId>
    </dependency>
</dependencies>

এখানে, spring-boot-starter-cache এবং hibernate-ehcache এর সাহায্যে ক্যাশিং সক্রিয় করা হবে। EhCache হোস্টিং ক্যাশিং ফ্রেমওয়ার্ক হিসেবে ব্যবহৃত হবে।

1.2. Application Properties কনফিগারেশন

Spring Boot অ্যাপ্লিকেশনে EhCache ব্যবহার করতে হলে, application.properties বা application.yml ফাইলে কিছু কনফিগারেশন সেট করতে হবে।

application.properties ফাইল:

spring.cache.type=ehcache
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.hibernate.cache.use_query_cache=true
spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory

এখানে, spring.cache.type=ehcache সেট করে EhCache কে ক্যাশিং সিস্টেম হিসেবে ব্যবহার করা হয়েছে এবং Hibernate এর second-level cache ব্যবহার করতে বলা হয়েছে।


2. Entity ক্যাশিং কনফিগারেশন

Spring Data JPA তে ক্যাশিং চালু করতে হলে, আপনি Hibernate Entity-এ @Cacheable অ্যানোটেশন ব্যবহার করতে পারেন। Hibernate Entity-এ ক্যাশিং কনফিগার করার মাধ্যমে, আপনি ডেটা ক্যাশে রাখার জন্য নির্দেশনা দিতে পারবেন।

উদাহরণ: User Entity তে ক্যাশিং কনফিগারেশন

package com.example.model;

import javax.persistence.*;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)  // Enable caching for this entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    private String email;

    // Getters and Setters
}

এখানে, @Cache অ্যানোটেশন ব্যবহার করে User Entity তে READ_WRITE ক্যাশিং কৌশল ব্যবহৃত হয়েছে, যার মানে হলো ক্যাশে ডেটা পড়া এবং লেখা হবে।


3. Repository-এ ক্যাশিং কনফিগারেশন

Spring Data JPA Repository-এ @Cacheable অ্যানোটেশন ব্যবহার করে ক্যাশিং নির্ধারণ করা যায়। @Cacheable অ্যানোটেশনটি সাধারণত Method level ক্যাশিং কনফিগারেশনে ব্যবহৃত হয়।

উদাহরণ: UserRepository Repository তে ক্যাশিং কনফিগারেশন

package com.example.repository;

import com.example.model.User;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

    @Cacheable(value = "users", key = "#name")  // Cache the method result by name
    User findByName(String name);
}

এখানে, @Cacheable অ্যানোটেশন ব্যবহার করা হয়েছে, যাতে findByName মেথডের আউটপুট ক্যাশে রাখা যায়। value হলো ক্যাশের নাম এবং key হলো ক্যাশের key যা এই মেথডের ইনপুট হিসেবে ব্যবহার করা হবে।


4. Service Layer-এ ক্যাশিং কনফিগারেশন

Spring Service Layer তেও ক্যাশিং কনফিগার করা যেতে পারে, যেখানে আপনি @CachePut, @CacheEvict এবং @Cacheable এর মতো অ্যানোটেশন ব্যবহার করতে পারেন।

উদাহরণ: Service Layer-এ ক্যাশিং কনফিগারেশন

package com.example.service;

import com.example.model.User;
import com.example.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    @Cacheable(value = "users", key = "#id")
    public User getUserById(Long id) {
        return userRepository.findById(id).orElse(null);
    }

    @CachePut(value = "users", key = "#user.id")
    public User updateUser(User user) {
        return userRepository.save(user);
    }

    @CacheEvict(value = "users", key = "#id")
    public void deleteUser(Long id) {
        userRepository.deleteById(id);
    }
}

এখানে:

  • @Cacheable: ক্যাশে থেকে ডেটা ফেচ করে (যদি এটি ক্যাশে না থাকে, তাহলে ডেটাবেস থেকে ফেচ হবে)।
  • @CachePut: মেথডের ফলাফল ক্যাশে আপডেট করে।
  • @CacheEvict: ক্যাশ থেকে নির্দিষ্ট ডেটা অপসারণ করে।

5. Cache Manager কনফিগারেশন

Spring Boot তে CacheManager কনফিগারেশন ব্যবহার করে ক্যাশিং সিস্টেম কাস্টমাইজ করা যায়। এটি EhCache বা অন্য ক্যাশিং সিস্টেম ব্যবহার করতে পারে।

উদাহরণ: CacheManager কনফিগারেশন

package com.example.config;

import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.cache.config.CacheConfiguration;

@Configuration
@EnableCaching
public class CacheConfig {

    @Bean
    public CacheManager cacheManager() {
        return new EhCacheCacheManager();
    }
}

এখানে, CacheManager কনফিগার করা হয়েছে EhCache ক্যাশিং ব্যবহারের জন্য।


6. Testing Cache

Spring Boot JPA ক্যাশিং সঠিকভাবে কাজ করছে কিনা তা পরীক্ষা করার জন্য, আপনি ডেটা ফেচ করার পর লগ আউটপুট পরীক্ষা করতে পারেন। একবার ডেটা ক্যাশে চলে গেলে, পরবর্তী ফেচে ডেটাবেসের পরিবর্তে ক্যাশ থেকেই ডেটা আসবে।


সারাংশ

Spring Boot JPA তে Caching ব্যবহারের মাধ্যমে ডেটাবেসে কম রিকোয়েস্ট পাঠানো যায় এবং অ্যাপ্লিকেশন পারফরম্যান্স উন্নত করা সম্ভব। @Cacheable, @CachePut, এবং @CacheEvict অ্যানোটেশনগুলি ব্যবহার করে আমরা ক্যাশিং কনফিগার করতে পারি। এছাড়াও, EhCache এবং CacheManager ব্যবহার করে কাস্টম ক্যাশিং কনফিগারেশন করা সম্ভব। JPA এর সাথে ক্যাশিং ব্যবহারের মাধ্যমে ডেটা ফেচ করার সময় second-level caching এবং query caching সহ ক্যাশিং কার্যকরভাবে ব্যবহার করা যায়, যা পারফরম্যান্স উন্নত করে।


Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...